浏览器最小延迟时间
根据MDN 文档 setTimeout:实际延时比设定值更久的原因:最小延迟时间中所说:
在浏览器中,setTimeout()/setInterval() 的每调用一次定时器的最小间隔是 4ms,这通常是由于函数嵌套导致(嵌套层级达到一定深度)。
在HTML Standard规范中也有提到更具体的:
Timers can be nested; after five such nested timers, however, the interval is forced to be at least four milliseconds.
简单来说,5 层以上的定时器嵌套会导致至少 4ms 的延迟。
为什么有最小时延 4ms
首先 html 规范是:
- 如果设置的
timeout
小于 0,则设置为 0 - 如果嵌套的层级超过了 5 层,并且 timeout 小于 4ms,则设置 timeout 为 4ms。
不同浏览器的最低时延会不一致,比如 chrome 的最低时延是 1ms
。而如果 timer 嵌套层级很多,那么最低时延是 4ms
。具体嵌套层级的阈值不同浏览器也不一致,HTML Standard 当中是 >5
,chrome 当中是 >=5
。
各大浏览器厂商没有按规范实现,是因为各有各的基准和权衡
1 | setTimeout(() => console.log(5), 5) |
为什么不能设置为0:如果浏览器允许 0ms
,会导致 JavaScript 引擎过度循环,网站很容易无响应
实现零延时定时器
1 | (function () { |